package org.ajax.dao.impl;

import org.ajax.dao.GoodDao;
import org.ajax.entity.Good;
import org.ajax.util.DbUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ZQX
 * @date 2024-11-20
 */
public class GoodDaoImpl implements GoodDao {
    @Override
    public int insertGood(Good good) {
        int row = 0;

        // 第一：定义要操作数据库的 SQL 语句
        String sql = "insert into goods values (?,?,?,?,?)";

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();
        PreparedStatement preparedStatement = null;
        // 第三：预编译 SQL 语句，并获取语句对象的实例
        try {
            preparedStatement = conn.prepareStatement(sql);

            // 第四：填充占位符
            // 语句对象.setXxx(索引,数据)
            // 其中，Xxx代表是数据类型，索引代表是问号的索引，从 1 开始
            preparedStatement.setString(1, good.getGoodId());
            preparedStatement.setString(2, good.getGoodName());
            preparedStatement.setDouble(3, good.getGoodPrice());
            preparedStatement.setDate(4, new Date(good.getGoodDate().getTime()));
            preparedStatement.setInt(5, good.getGoodStatus());

            // 第五：执行SQL语句
            // executeUpdate()：执行增、删、改操作，返回受影响的行数
            // executeQuery()：执行查询操作，返回结果集对象
            row = preparedStatement.executeUpdate();

            // 第六：对执行的结果进行处理
        } catch (SQLException e) {
            // 对捕获的异步进行处理，保证程序能正常往下执行
            System.out.println("预编译 SQL 语句失败...");
        } finally {
            // 第七：关闭对象，释放资源
            DbUtil.close(null, preparedStatement, conn);
        }
        return row;
    }

    @Override
    public int deleteGood(String goodId) {
        int row = 0;

        // 第一：定义要操作数据库的 SQL 语句
        String sql = "delete from goods where good_id=?";

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();
        PreparedStatement preparedStatement = null;
        // 第三：预编译 SQL 语句，并获取语句对象的实例
        try {
            preparedStatement = conn.prepareStatement(sql);

            // 第四：填充占位符
            // 语句对象.setXxx(索引,数据)
            // 其中，Xxx代表是数据类型，索引代表是问号的索引，从 1 开始
            preparedStatement.setString(1, goodId);

            // 第五：执行SQL语句
            // executeUpdate()：执行增、删、改操作，返回受影响的行数
            // executeQuery()：执行查询操作，返回结果集对象
            row = preparedStatement.executeUpdate();

            // 第六：对执行的结果进行处理
        } catch (SQLException e) {
            // 对捕获的异步进行处理，保证程序能正常往下执行
            System.out.println("预编译 SQL 语句失败...");
        } finally {
            // 第七：关闭对象，释放资源
            DbUtil.close(null, preparedStatement, conn);
        }
        return row;
    }

    @Override
    public int updateGood(Good good) {
        int row = 0;

        // 第一：定义要操作数据库的 SQL 语句
        String sql = "update goods set good_name=?,good_price=?,good_date=?,good_status=? where good_id=?";

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();
        PreparedStatement preparedStatement = null;
        // 第三：预编译 SQL 语句，并获取语句对象的实例
        try {
            preparedStatement = conn.prepareStatement(sql);

            // 第四：填充占位符
            // 语句对象.setXxx(索引,数据)
            // 其中，Xxx代表是数据类型，索引代表是问号的索引，从 1 开始
            preparedStatement.setString(1, good.getGoodName());
            preparedStatement.setDouble(2, good.getGoodPrice());
            preparedStatement.setDate(3, new Date(good.getGoodDate().getTime()));
            preparedStatement.setInt(4, good.getGoodStatus());
            preparedStatement.setString(5, good.getGoodId());

            // 第五：执行SQL语句
            // executeUpdate()：执行增、删、改操作，返回受影响的行数
            // executeQuery()：执行查询操作，返回结果集对象
            row = preparedStatement.executeUpdate();

            // 第六：对执行的结果进行处理
        } catch (SQLException e) {
            // 对捕获的异步进行处理，保证程序能正常往下执行
            System.out.println("预编译 SQL 语句失败...");
        } finally {
            // 第七：关闭对象，释放资源
            DbUtil.close(null, preparedStatement, conn);
        }
        return row;
    }

    @Override
    public List<Good> selectGood() {
        List<Good> list = new ArrayList<>();

        // 第一：定义操作数据库的 SQL
        String sql = "select * from goods";
        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();

        PreparedStatement psmt = null;
        ResultSet rst = null;
        try {
            // 第三：预编译 SQL 语句，获取 PreparedStatement 对象
            psmt = conn.prepareStatement(sql);

            // 第四：填充占位符（可选）
            // 第五：执行 SQL 语句
            rst = psmt.executeQuery();
            // 第六：对执行的结果进行处理
            while (rst.next()) {
                // 1.实例化实体对象
                Good g = new Good();

                // 2.读到当前行各列的数据
                String id = rst.getString(1);
                String name = rst.getString(2);
                double price = rst.getDouble(3);
                Date date = rst.getDate(4) ;
                int state = rst.getInt(5);

                // 3.初始化对象
                g.setGoodId(id);
                g.setGoodName(name);
                g.setGoodPrice(price);
                g.setGoodDate(date);
                g.setGoodStatus(state);

                // 4.添加集合
                list.add(g);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 第七：关闭相关的 JDBC 对象
            DbUtil.close(rst, psmt, conn);
        }
        return list;
    }
}
